package com.ryan.ohos.extension.event.interfaces;

import ohos.multimodalinput.event.TouchEvent;

/**
 * 包含子控件的事件分发接口，需要拦截或分发事件的ComponentContainer需实现此接口
 */
public interface ViewGroup extends View {

    /**
     * 当子控件不想父控件通过{@link #onInterceptTouchEvent(TouchEvent)}拦截事件时，调用此方法
     * @param disallowIntercept 如果子控件不想父控件拦截事件，传递true
     */
    void requestDisallowInterceptTouchEvent(boolean disallowIntercept);

    /**
     * 当需要拦截所有触摸事件时，实现此方法。
     * 注意：如果需要在后续再拦截事件，则down事件不要返回true，不然子控件会由于事件冒泡机制而收不到down之后的事件。
     *
     * 当此方法返回true，事件会传递到onTouchEvent()方法中，如果在onTouchEvent中返回true后，
     * 后续的事件将会持续到控件的onTouchEvent()方法中，并且不会再传递到onInterceptTouchEvent()中。
     *
     * 当此方法返回false，事件会首先被传递onInterceptTouchEvent()中，然后再到子控件的onTouchEvent()中。
     * 一旦此方法返回了true，子控件将会收到最后一次CANCEL事件，并且事件也不会再传递到onInterceptTouchEvent这里，
     * 而是直接传递到自己的onTouchEvent中。
     *
     * @param ev 被传递下来的触摸事件
     * @return 当需要拦截子控件的触摸事件时，返回true，这时事件会传递到{@link View#onTouchEvent(TouchEvent)}中。
     * 子控件将收到CANCEL事件，并且后续事件不会再传递到该控件中。
     */
    boolean onInterceptTouchEvent(TouchEvent ev);
}
